<?php
require(APPPATH.'libraries/REST_Controller.php');

class SmsRestService extends REST_Controller {

	public function __construct() {
        parent::__construct();
        $this->load->model('banco_model');
        $this->load->model('categoria_model');
        $this->load->model('categoria_equiv_model');
        $this->load->model('moneda_model');
        $this->load->model('moneda_equiv_model');
        $this->load->model('establecimiento_model');
        $this->load->model('establecimiento_equiv_model');
        $this->load->model('usuario_model');
        $this->load->model('transaccion_model');
        $this->load->helper('url');
        $this->load->database('default');
    }

	public function datosprueba_get () {
        $banco = $this->get('ban');
		$establecimiento = $this->get('est');
        $categoria = $this->get('cat');
        $moneda = $this->get('mon');
        $tipo = $this->get('tip');
        
        $this->obtenerDatos ($banco, $establecimiento, $categoria, $moneda, $tipo);
	}

	public function datos_post () {
        $banEncode = $this->post('ban');
        $banco = base64_decode($banEncode);
        
		$estEncode = $this->post('est');
        $establecimiento = base64_decode($estEncode);

        $catEncode = $this->post('cat');
        $categoria = base64_decode($catEncode);

        $monEncode = $this->post('mon');
        $moneda = base64_decode($monEncode);

        $tipEncode = $this->post('tip');
        $tipo = base64_decode($tipEncode);
        
        $this->obtenerDatos ($banco, $establecimiento, $categoria, $moneda, $tipo);
	}

	public function lista_get () {
        $nomUser = $this->get('usr');
		$trans = $this->get('trn');
		log_message('info', "usuario: $nomUser");
		log_message('info', "trans: $trans");

		$this->procesarLista ($nomUser, $trans);
	}

	public function lista_post () {
        $usrEncode = $this->post('usr');
        $nomUser = base64_decode($usrEncode);
        
		$trnEncode = $this->post('trn');
        $trans = base64_decode($trnEncode);
        
		$this->procesarLista ($nomUser, $trans);
	}
	
	private function procesarLista ($nomUser, $trans) {
        $listaTrans = json_decode($trans, true);
        
        $respuesta = new stdClass();
        
        $usuario = $this->usuario_model->obtererPorCodigo($nomUser);
        $idUsuario = null;
        if ($usuario == null || $usuario->ID_USUARIO == null) {
        	$codigo = $this->usuario_model->generarCodigoUsuario();
        	$idUsuario = $this->usuario_model->guardar(null, $codigo, null, null);
        	$respuesta->cus = $codigo;
        	
        } else {
        	$idUsuario = $usuario->ID_USUARIO;
        }
        
        $listaResultado = array();
        foreach ($listaTrans as $key => $itemTrans) {
        	$resultado = $this->procesarDatos ($idUsuario, $itemTrans);
        	if ($resultado != null) {
        		array_push ($listaResultado, $resultado);
        	}
        }
        
        $respuesta->lre = $listaResultado;
        
		$this->response($respuesta, 200);
	}
	
	private function procesarDatos ($idUsuario, $item) {
		log_message('debug', "inicio procesarDatos");
		
		$transaccion = new stdClass();
		$resultado = new stdClass();
		
		//if ($usuario != null && $usuario->ID_USUARIO != null) {
	        $completo = $this->valor ($item, 'com');
	        $idBanco = $this->valor ($item, 'iba');
	        log_message('info', "completo: $completo");
	        $cambio = 0;
	        $nombreEstablecimiento = null;
	        $nombreMoneda = null;

	        $transaccion->idUsuario = $idUsuario;
	        $transaccion->idBanco = $idBanco;
	        $transaccion->monto = $this->valor ($item, 'mnt');
	        $transaccion->fechaSMS = $this->valor ($item, 'fsms');
	        $transaccion->fechaTrans = $this->valor ($item, 'ftra');
	        $transaccion->numero = $this->valor ($item, 'num');
	        $transaccion->tipo = $this->valor ($item, 'tip');
	        
	        if ($completo) {
		        $transaccion->idEstablecimiento = $this->valor ($item, 'ies');
		        $transaccion->idEstablecimientoEquiv = $this->valor ($item, 'iee');
		        $transaccion->idCategoria = $this->valor ($item, 'ica');
		        $transaccion->idCategoriaEquiv = $this->valor ($item, 'ice');
		        $transaccion->idMoneda = $this->valor ($item, 'imo');
		        $transaccion->idMonedaEquiv = $this->valor ($item, 'ime');
	        	
	        } else {
		        $estEquiv = $this->valor ($item, 'nee');
		        log_message('info', "estEquiv: $estEquiv");
		        $catEquiv = $this->valor ($item, 'nce');
		        log_message('info', "catEquiv: $catEquiv");
		        
		        $respuesta = new stdClass();
		        $respuesta->idCategoria = null;
		        $respuesta->idCategoriaEquiv = null;
		        $respuesta->idEstablecimiento = null;
		        $respuesta->nombreEstablecimiento = null;
		        $respuesta->idEstablecimientoEquiv = null;
		        
		        // se busca las expresiones de cambio (3)
		        //$listEstEquiv = $this->establecimiento_equiv_model->obtenerSoloExpresion ($idBanco, 3);
		        //$listCatEquiv = $this->categoria_equiv_model->obtenerSoloExpresion ($idBanco, 3);
		        
		        if ($estEquiv != null && $estEquiv != '') {
		        	$listCatEquiv = $this->categoria_equiv_model->obtenerPorExpresion ($idBanco, 2);
		        	// Si el token no es establecimiento
			        foreach ($listCatEquiv as $valCa) {
			        	if (preg_match("/".$valCa->NOMBRE."/", $estEquiv)) {
			        		log_message('info', "el token (estEquiv) no es establecimiento");
			        		
			        		$respuesta->idCategoria = $valCa->ID_CATEGORIA;
		        			log_message('info', "idCategoria: $respuesta->idCategoria");
		        			
		        			$catEquivTemp = $this->categoria_equiv_model->obtenerItemXNombre ($estEquiv, $idBanco);
		        			if ($catEquivTemp == null) {
		        				$respuesta->idCategoriaEquiv = $this->categoria_equiv_model->guardar ($estEquiv,
		        						$respuesta->idCategoria, 0, $idBanco);
		        			} else {
		        				$respuesta->idCategoriaEquiv = $catEquivTemp->ID_CATEGORIA_EQUIV;
		        			}
		        			log_message('info', "idCategoriaEquiv: $respuesta->idCategoriaEquiv");
			        		
			        		$cambio = 1; // de establecimiento a categoria
			        		$respuesta->expresion = $valCa->NOMBRE;
			        		break;
			        	}
			        }
			        if ($cambio == 0) {
		        		$listEstEquiv = $this->establecimiento_equiv_model->obtenerPorExpresion ($idBanco, 1);
				        foreach ($listEstEquiv as $valEE) {
				        	if (preg_match("/".$valEE->NOMBRE."/", $estEquiv)) {
			        			log_message('info', "el token (estEquiv) es establecimiento");
			        			
					        	$respuesta->idEstablecimiento = $valEE->ID_ESTABLECIMIENTO;
		        				log_message('info', "idEstablecimiento: $respuesta->idEstablecimiento");
		        				
		        				$estEquivTemp = $this->establecimiento_equiv_model->obtenerItemXNombre ($estEquiv, $idBanco);
		        				if ($estEquivTemp == null) {
		        					$respuesta->idEstablecimientoEquiv = $this->establecimiento_equiv_model->guardar ($estEquiv, 
		        							$respuesta->idEstablecimiento, 0, $idBanco);
		        				} else {
		        					$respuesta->idEstablecimientoEquiv = $estEquivTemp->ID_ESTABLECIMIENTOS_EQUIV;
		        				}
		        				log_message('info', "idEstablecimientoEquiv: $respuesta->idEstablecimientoEquiv");
					        	
					        	$estTemp = $this->establecimiento_model->obtererItem ($respuesta->idEstablecimiento);
				        		$respuesta->idCategoria = $estTemp->ID_CATEGORIA;
				        		$respuesta->nombreEstablecimiento = $estTemp->NOMBRE;
		        				log_message('info', "Categoria: $respuesta->idCategoria - $respuesta->nombreEstablecimiento");
				        		
			        			$cambio = 3; // se encontro en una expresion regular
			        			$respuesta->expresion = $valEE->NOMBRE;
				        		break;
				        	}
				        }
			        }
			        
		        } else if ($catEquiv != null && $catEquiv != '') {
		        	$listCatEquiv = $this->categoria_equiv_model->obtenerPorExpresion ($idBanco, 2);
			        foreach ($listCatEquiv as $valCa) {
			        	if (preg_match("/".$valCa->NOMBRE."/", $catEquiv)) {
			        		log_message('info', "el token (catEquiv) es categoria");
			        		
			        		$respuesta->idCategoria = $valCa->ID_CATEGORIA;
		        			log_message('info', "idCategoria: $respuesta->idCategoria");
		        			
		        			$catEquivTemp = $this->categoria_equiv_model->obtenerItemXNombre ($catEquiv, $idBanco);
		        			if ($catEquivTemp == null) {
		        				$respuesta->idCategoriaEquiv = $this->categoria_equiv_model->guardar ($catEquiv,
		        						$respuesta->idCategoria, 0, $idBanco);
		        			} else {
		        				$respuesta->idCategoriaEquiv = $catEquivTemp->ID_CATEGORIA_EQUIV;
		        			}
		        			log_message('info', "idCategoriaEquiv: $respuesta->idCategoriaEquiv");
			        		
			        		$cambio = 3; // se encontro en una expresion regular
			        		$respuesta->expresion = $valCa->NOMBRE;
			        		break;
			        	}
			        }
			        // Si el token no es categoria
			        if ($cambio == 0) {
		        		$listEstEquiv = $this->establecimiento_equiv_model->obtenerPorExpresion ($idBanco, 1);
				        foreach ($listEstEquiv as $valEE) {
				        	if (preg_match("/".$valEE->NOMBRE."/", $catEquiv)) {
			        			log_message('info', "el token (catEquiv) no es categoria");
			        			
					        	$respuesta->idEstablecimiento = $valEE->ID_ESTABLECIMIENTO;
		        				log_message('info', "idEstablecimiento: $respuesta->idEstablecimiento");
		        				
		        				$estEquivTemp = $this->establecimiento_equiv_model->obtenerItemXNombre ($catEquiv, $idBanco);
		        				if ($estEquivTemp == null) {
		        					$respuesta->idEstablecimientoEquiv = $this->establecimiento_equiv_model->guardar ($catEquiv,
		        							$respuesta->idEstablecimiento, 0, $idBanco);
		        				} else {
		        					$respuesta->idEstablecimientoEquiv = $estEquivTemp->ID_ESTABLECIMIENTOS_EQUIV;
		        				}
		        				log_message('info', "idEstablecimientoEquiv: $respuesta->idEstablecimientoEquiv");
					        	
					        	$estTemp = $this->establecimiento_model->obtererItem ($respuesta->idEstablecimiento);
				        		$respuesta->idCategoria = $estTemp->ID_CATEGORIA;
		        				log_message('info', "Categoria: $respuesta->idCategoria - $estTemp->NOMBRE");
				        		
			        			$cambio = 2; // de categoria a establecimiento
			        			$respuesta->expresion = $valEE->NOMBRE;
				        		break;
				        	}
				        }
			        }
		        }
	
		        log_message('info', "cambio: $cambio");
		        if ($cambio > 0) {
		        	log_message('info', "existe cambio");
		        	
		        	$rpta = $this->procesarMoneda ($this->valor ($item, 'nme'), $this->valor ($item, 'imo'), 
		        			$this->valor ($item, 'ime'));
		        	
		        	$respuesta->idMoneda = $rpta->idMoneda;
		        	$respuesta->idMonedaEquiv = $rpta->idMonedaEquiv;
		        	$respuesta->nombreMoneda = $rpta->nombreMoneda;
		        	
		        } else {
		        	log_message('info', "no existe cambio");
				
					$respuesta = $this->procesarItem ($this->valor ($item, 'iba'), $this->valor ($item, 'nee'), 
							$this->valor ($item, 'ies'), $this->valor ($item, 'iee'), $this->valor ($item, 'nce'), 
							$this->valor ($item, 'ica'), $this->valor ($item, 'ice'), $this->valor ($item, 'nme'), 
							$this->valor ($item, 'imo'), $this->valor ($item, 'ime'));
		        }
					
				$transaccion->idCategoria = $respuesta->idCategoria;
				$transaccion->idCategoriaEquiv = $respuesta->idCategoriaEquiv;
		        $transaccion->idEstablecimiento = $respuesta->idEstablecimiento;
		        $transaccion->idEstablecimientoEquiv = $respuesta->idEstablecimientoEquiv;
		        $transaccion->idMoneda = $respuesta->idMoneda;
		        $transaccion->idMonedaEquiv = $respuesta->idMonedaEquiv;
		        
		        $nombreEstablecimiento = $respuesta->nombreEstablecimiento;
		        $nombreMoneda = $respuesta->nombreMoneda;
	        }
	        
	        $idTransaccion = $this->transaccion_model->guardar ($transaccion);
	        
	        $resultado->itv = $idTransaccion;
			$resultado->ido = $this->valor ($item, 'id');
		    $resultado->ica = $transaccion->idCategoria;
		    $resultado->icv = $transaccion->idCategoriaEquiv;
		    $resultado->ies = $transaccion->idEstablecimiento;
		    $resultado->nes = $nombreEstablecimiento;
		    $resultado->iev = $transaccion->idEstablecimientoEquiv;
		    $resultado->imo = $transaccion->idMoneda;
		    $resultado->nmo = $nombreMoneda;
		    $resultado->imv = $transaccion->idMonedaEquiv;
		    
		    $resultado->cmb = $cambio; //0: no cambio, 1: de establecimiento a categoria, 2: de categoria a establecimiento, 3: se encontro en una expresion regular
		    if ($cambio > 0) {
		    	$resultado->exp = $respuesta->expresion;
		    }
		//}
		log_message('debug', "fin procesarDatos");
		
		return $resultado;
	}
	
	public function valor ($item, $nombre) {
		if (isset($item[$nombre])) {
			return $item[$nombre];
		}
		return null;
	}
	
	private function procesarItem ($banco, $nombEstabEquiv, $estab, $estabEquiv, 
			$nombCategEquiv, $categ, $categEquiv, $nombMoneEquiv, $mone, $moneEquiv) {
		log_message('debug', "inicio procesarItem");
		
        $respuesta = new stdClass();
        $respuesta->idCategoria = null;
        $respuesta->idCategoriaEquiv = null;
        $respuesta->idEstablecimiento = null;
        $respuesta->nombreEstablecimiento = null;
        $respuesta->idEstablecimientoEquiv = null;
        $respuesta->idMoneda = null;
        $respuesta->nombreMoneda = null;
        $respuesta->idMonedaEquiv = null;
        
        if ($categ != null && $categ != '') {
        	$respuesta->idCategoria = $categ;
         	log_message('info', "idCategoria: $respuesta->idCategoria");
        	$respuesta->idCategoriaEquiv = $categEquiv;
        	log_message('info', "idCategoriaEquiv: $respuesta->idCategoriaEquiv");
        	
        } else if ($categEquiv != null && $categEquiv != '') {
        	$catTmp = $this->categoria_equiv_model->obtererPorId ($categEquiv);
        	if ($catTmp != null) {
        		$respuesta->idCategoria = $catTmp->ID_CATEGORIA;
        		log_message('info', "existe la categoria en la base de datos: $respuesta->idCategoria");
        	}
        	$respuesta->idCategoriaEquiv = $categEquiv;
        	log_message('info', "idCategoriaEquiv: $respuesta->idCategoriaEquiv");
        	
        } else if ($nombCategEquiv != null && $nombCategEquiv != '') {
        	$catTmp = $this->categoria_equiv_model->obtenerItemXNombre ($nombCategEquiv, $banco);
        	if ($catTmp == null) {
        		log_message('info', "no existe la categoria en la base de datos");
        		$idCatTmp = $this->categoria_equiv_model->guardar ($nombCategEquiv, null, 0, $banco);
        		$respuesta->idCategoriaEquiv = $idCatTmp;
        		log_message('info', "idCategoriaEquiv: $respuesta->idCategoriaEquiv");
        		
        	} else {
        		log_message('info', "existe la categoria en la base de datos");
        		$respuesta->idCategoria = $catTmp->ID_CATEGORIA;
        		$respuesta->idCategoriaEquiv = $catTmp->ID_CATEGORIA_EQUIV;
	        	log_message('info', "idCategoria: $respuesta->idCategoria - idCategoriaEquiv: $respuesta->idCategoriaEquiv");
        	}
        }
        
        if ($estab != null && $estab != null) {
        	$respuesta->idEstablecimiento = $estab;
         	log_message('info', "idEstablecimiento: $respuesta->idEstablecimiento");
        	$respuesta->idEstablecimientoEquiv = $estabEquiv;
        	log_message('info', "idEstablecimientoEquiv: $respuesta->idEstablecimientoEquiv");
        	
        } else if ($estabEquiv != null && $estabEquiv != '') {
        	$estTmp = $this->establecimiento_equiv_model->obtererPorId ($estabEquiv);
        	if ($estTmp != null) {
        		$respuesta->idEstablecimiento = $estTmp->ID_ESTABLECIMIENTO;
        		log_message('info', "existe el establecimiento en la base de datos: $respuesta->idEstablecimiento");
        	}
        	$respuesta->idEstablecimientoEquiv = $estabEquiv;
        	log_message('info', "idEstablecimientoEquiv: $respuesta->idEstablecimientoEquiv");
        	
        } else if ($nombEstabEquiv != null && $nombEstabEquiv != '') {
        	$estTmp = $this->establecimiento_equiv_model->obtenerItemXNombre ($nombEstabEquiv, $banco);
        	if ($estTmp == null) {
        		log_message('info', "no existe el establecimiento en la base de datos");
        		$idEstTmp = $this->establecimiento_equiv_model->guardar ($nombEstabEquiv, null, 0, $banco);
        		$respuesta->idEstablecimientoEquiv = $idEstTmp;
        		log_message('info', "idEstablecimientoEquiv: $respuesta->idEstablecimientoEquiv");
        		
        	} else {
        		log_message('info', "existe el establecimiento en la base de datos");
	        	$respuesta->idEstablecimiento = $estTmp->ID_ESTABLECIMIENTO;
	        	$respuesta->idEstablecimientoEquiv = $estTmp->ID_ESTABLECIMIENTOS_EQUIV;
	        	log_message('info', "idEstablecimiento: $respuesta->idEstablecimiento - idEstablecimientoEquiv: $respuesta->idEstablecimientoEquiv");
        	}
        }
        
        if ($respuesta->idEstablecimiento != null) {
        	$establecimiento = $this->establecimiento_model->obtererItem ($respuesta->idEstablecimiento);
        	$respuesta->nombreEstablecimiento = $establecimiento->NOMBRE;
        	if ($respuesta->idCategoria == null) {
        		$respuesta->idCategoria = $establecimiento->ID_CATEGORIA;
        	}
        }

        if ($respuesta->idCategoria == null) {
        	$respuesta->idCategoria = 1; // Categoria Otros
        	log_message('info', "no tiene categoria, se asigna a Categoria Otros");
        }
        
        $rpta = $this->procesarMoneda ($nombMoneEquiv, $mone, $moneEquiv);
        
        $respuesta->idMoneda = $rpta->idMoneda;
        $respuesta->idMonedaEquiv = $rpta->idMonedaEquiv;
        $respuesta->nombreMoneda = $rpta->nombreMoneda;
        
        log_message('debug', "fin procesarItem");
        
        return $respuesta;
	}
	
	private function procesarMoneda ($nombMoneEquiv, $mone, $moneEquiv) {
		log_message('debug', "inicio procesarMoneda");

		$respuesta = new stdClass();
        $respuesta->idMoneda = null;
        $respuesta->idMonedaEquiv = null;
        $respuesta->nombreMoneda = null;

        if ($mone != null && $mone != '') {
        	$respuesta->idMoneda = $mone;
        	log_message('info', "idMoneda: $respuesta->idMoneda");
        	$respuesta->idMonedaEquiv = $moneEquiv;
        	log_message('info', "idMonedaEquiv: $respuesta->idMonedaEquiv");
        	 
        } else if ($moneEquiv != null && $moneEquiv != '') {
        	$monTmp = $this->moneda_equiv_model->obtererPorId ($moneEquiv);
        	if ($monTmp != null) {
        		$respuesta->idMoneda = $monTmp->ID_MONEDA;
        		log_message('info', "existe moneda en la base de datos: $respuesta->idMoneda");
        	}
        	$respuesta->idMonedaEquiv = $moneEquiv;
        	log_message('info', "idMonedaEquiv: $respuesta->idMonedaEquiv");
        	 
        } else if ($nombMoneEquiv != null && $nombMoneEquiv != '') {
        	$monTmp = $this->moneda_equiv_model->obtenerItemXNombre ($nombMoneEquiv);
        	if ($monTmp == null) {
        		log_message('info', "no existe moneda en la base de datos");
        		$idMonTmp = $this->moneda_equiv_model->guardar ($nombMoneEquiv, null);
        		$respuesta->idMonedaEquiv = $idMonTmp;
        		log_message('info', "idMonedaEquiv: $respuesta->idMonedaEquiv");
        
        	} else {
        		log_message('info', "existe moneda en la base de datos");
        		$respuesta->idMoneda = $monTmp->ID_MONEDA;
        		$respuesta->idMonedaEquiv = $monTmp->ID_MONEDA_EQUIV;
        		log_message('info', "idMoneda: $respuesta->idMoneda - idMonedaEquiv: $respuesta->idMonedaEquiv");
        	}
        }
        
        if ($respuesta->idMoneda != null) {
        	$moneda = $this->moneda_model->obtererItem ($respuesta->idMoneda);
        	$respuesta->nombreMoneda = $moneda->NOMBRE;
        }
		
		log_message('debug', "fin procesarMoneda");

		return $respuesta;
	}

	/** Categoria y establecimiento no llegan juntos
	 */
	private function obtenerDatos ($banEquiv, $estEquiv, $catEquiv, $monEquiv, $tipEquiv) {
        $respuesta = new stdClass();
        
        $establecimiento = null;
        $establecimientoEquiv = null;
        $categoria = null;
        $categoriaEquiv = null;
        $listEstEquiv = $this->establecimiento_equiv_model->obtenerPorExpresion ($banEquiv);
        $listCatEquiv = $this->categoria_equiv_model->obtenerPorExpresion ($banEquiv);
        
        if ($estEquiv != null && $estEquiv != '') {
        	// Si el token no es establecimiento
	        foreach ($listCatEquiv as $valCa) {
	        	if (preg_match("/".$valCa->NOMBRE."/", $estEquiv)) {
	        		$catEquiv = $estEquiv;
	        		$estEquiv = null;
	        		$categoriaEquiv = $valCa;
	        		$categoria = $this->categoria_model->obtererItem ($valCa->ID_CATEGORIA);
	        		break;
	        	}
	        }
	        if ($categoria == null) {
		        foreach ($listEstEquiv as $valEE) {
		        	if (preg_match("/".$valEE->NOMBRE."/", $estEquiv)) {
		        		$establecimientoEquiv = $valEE;
		        		$establecimiento = $this->establecimiento_model->obtererItem ($valEE->ID_ESTABLECIMIENTO);
		        		break;
		        	}
		        }
	        }
	        
        } else if ($catEquiv != null && $catEquiv != '') {
	        foreach ($listCatEquiv as $valCa) {
	        	if (preg_match("/".$valCa->NOMBRE."/", $catEquiv)) {
	        		$categoriaEquiv = $valCa;
	        		$categoria = $this->categoria_model->obtererItem ($valCa->ID_CATEGORIA);
	        		break;
	        	}
	        }
	        // Si el token no es categoria
	        if ($categoria == null) {
		        foreach ($listEstEquiv as $valEE) {
		        	if (preg_match("/".$valEE->NOMBRE."/", $catEquiv)) {
		        		$estEquiv = $catEquiv;
		        		$catEquiv = null;
		        		$establecimientoEquiv = $valEE;
		        		$establecimiento = $this->establecimiento_model->obtererItem ($valEE->ID_ESTABLECIMIENTO);
		        		break;
		        	}
		        }
	        }
        }
        
        // establecimiento
        $idCategoria = null;
		if ($estEquiv != null && $estEquiv != '') {
			if ($establecimientoEquiv == null) {
				$establecimientoEquiv = $this->establecimiento_equiv_model->obtenerItemXNombre ($estEquiv, $banEquiv);
			}
			if ($establecimientoEquiv == null) {
				$idEstEquiv = $this->establecimiento_equiv_model->guardar ($estEquiv, null, 0, $banEquiv, null);
				$respuesta->iev = $idEstEquiv;
				
			} else {
				$respuesta->iev = $establecimientoEquiv->ID_ESTABLECIMIENTOS_EQUIV;
				if ($establecimientoEquiv->ID_ESTABLECIMIENTO != null) {
					$establecimiento = $this->establecimiento_model->obtererItem ($establecimientoEquiv->ID_ESTABLECIMIENTO);
					$respuesta->ies = $establecimiento->ID_ESTABLECIMIENTO;
					$respuesta->nes = $establecimiento->NOMBRE;
					$idCategoria = $establecimiento->ID_CATEGORIA;
				}
			}
		}
		
		// categoria
		if ($catEquiv != null && $catEquiv != '') {
			if ($categoriaEquiv == null) {
				$categoriaEquiv = $this->categoria_equiv_model->obtenerItemXNombre ($catEquiv);
			}
			if ($categoriaEquiv == null) {
				$idCatEquiv = $this->categoria_equiv_model->guardar ($catEquiv, null, $banEquiv);
				$respuesta->icv = $idCatEquiv;
				
			} else {
				$respuesta->icv = $categoriaEquiv->ID_CATEGORIA_EQUIV;
				if ($categoriaEquiv->ID_CATEGORIA != null) {
					$categoria = $this->categoria_model->obtererItem ($categoriaEquiv->ID_CATEGORIA);
					$respuesta->ica = $categoria->ID_CATEGORIA;
					$respuesta->nca = $categoria->NOMBRE;
				}
			}
		} else if ($idCategoria != null) {
			$categoria = $this->categoria_model->obtererItem ($idCategoria);
			$respuesta->ica = $categoria->ID_CATEGORIA;
			$respuesta->nca = $categoria->NOMBRE;
		}
		
		// moneda
		if ($monEquiv != null && $monEquiv != '') {
			$monedaEquiv = $this->moneda_equiv_model->obtenerItemXNombre ($monEquiv);
			if ($monedaEquiv == null) {
				$idMonEquiv = $this->moneda_equiv_model->guardar ($monEquiv, null);
				$respuesta->imv = $idMonEquiv;
				
			} else {
				$respuesta->imv = $monedaEquiv->ID_MONEDA_EQUIV;
				if ($monedaEquiv->ID_MONEDA != null) {
					$moneda = $this->moneda_model->obtererItem ($monedaEquiv->ID_MONEDA);
					$respuesta->imo = $moneda->ID_MONEDA;
					$respuesta->nmo = $moneda->NOMBRE;
				}
			}
		}
        
		$this->response($respuesta, 200);
	}
}